\chapter{深度学习笔记}
	\section{后向传播算法}
	\subsection{微分的链式法则}
	对一个标量复合函数$ z=f(g(x)) $而言，
	\[ \frac{dz}{dx}=\frac{dz}{dy}\frac{dy}{dx} \]
	
	若$ g $是从$ \mathbb{R}^m $到$ \mathbb{R}^n $的映射，$ f $是从$\mathbb{R}^n  $到$ \mathbb{R} $的映射，如果$ \bm{y}=g(\bm{x}),z=f(\bm{y}) $，那么有，
	\begin{equation}\label{6-1}
	 \frac{\partial z}{\partial x_i}=\sum_{j} \frac{\partial z}{\partial y_j}\frac{\partial y_j}{\partial x_i}
	\end{equation}
	 
或者可以向量的形式写作，
\[\triangledown_{\bm{x}}z=\left(\frac{\partial \bm{y}}{\partial \bm{x}}\right)^T\triangledown_{\bm{y}}z\]

通常情况下，并不应用梯度于向量，而是应用于一个任意维度的张量，标量$ z $对张量$ \bm{X} $的梯度可以记为$ \triangledown _{\bm{X}}z $，它其中的某一个元素实际上就是$ (\triangledown _{\bm{X}}z)_i=\frac{\partial z}{\partial \bm{X}_i} $，对比\eqref{6-1}式，可以写下张量形式的梯度公式，
\begin{equation}\label{6-2}
\triangledown_{\bm{X}}z=\sum_j\left(\triangledown_{\bm{X}}\bm{Y}_j\right)\frac{\partial z}{\partial \bm{Y}_j}
\end{equation}


\subsection{代码的执行}

对每个变量$ \bm{V} $假设其都对应如下子程序：
\begin{itemize}
	\item \texttt{get\_operation}($ \bm{V} $): 返回计算$ \bm{V} $的操作，即图中流入$ \bm{V} $的边；
	\item \texttt{get\_consumers}($\bm{V},\mathcal{G}$): 返回图$ \mathcal{G} $中$ \bm{V} $的子变量；
	\item \texttt{get\_inputs}($ \bm{V},\mathcal{G} $): 返回图$ \mathcal{G} $中$ \bm{V} $的父变量；	
\end{itemize}

再定义一个计算\eqref{6-2}式的雅可比向量积运算函数\texttt{op.bprop(inputs,}$\bm{X},\bm{G}$)，其中$ \bm{G} $表示\eqref{6-2}式中的$ \frac{\partial z}{\partial \bm{Y}_j} $，\texttt{op.bprop(inputs,}$\bm{X},\bm{G}$)返回，
\[ \sum_i(\triangledown_{\bm{X}}\text{\texttt{op.f(inputs)}}_i\bm{G}_i) \]

书中的算法6.6比较详细地列出了算法步骤。

	某个标量$ u^{(n)} $有$ n_i $个输入节点$ u^{(1)},\cdots,u^{(n_i)} $。
	
	$ u^{(n)} $就像成本函数，$ u^{(1)},\cdots,u^{(n_i)} $就像模型参数，我们想要计算导数$ \frac{\partial u^{(n)}}{\partial u^{(i)}},i\in \{1,2,\cdots,n_i\} $.
	
	每个节点有伴随一个运算$ f^{(i)} $,
	\[ u^{(i)}=f(\mathbb{A}^{(i)}) \]
	其中，$ \mathbb{A} $是$ u^{(i)} $的所有父节点。
